/**
 * 判断是否是合法的金额（支持字符串或数字，整数或小数）
 * @param {any} value 要判断的值
 * @returns {boolean}
 * @example
 * isValidAmount('123.45') => true
 * isValidAmount('abc') => false
 * isValidAmount(100) => true
 * isValidAmount('100.00') => true
 */
export function isValidAmount(value) {
  return (
    typeof value === 'number' || (typeof value === 'string' && /^-?\d+(\.\d+)?$/.test(value.trim()))
  )
}

/**
 * 将金额格式化为带千分位的字符串（默认保留两位小数）
 * @param {any} value 输入值（字符串或数字）
 * @param {number} decimalPlaces 保留小数位数，默认2
 * @returns {string}
 * @example
 * formatAmount(1234567.8) => "1,234,567.80"
 * formatAmount('1000') => "1,000.00"
 * formatAmount('abc') => "0.00"
 */
export function formatAmount(value, decimalPlaces = 2) {
  if (!isValidAmount(value)) return '0.00'
  const num = Number(value)
  return num.toFixed(decimalPlaces).replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}

/**
 * 将带千分位的金额字符串转为数字
 * @param {any} value 输入值
 * @returns {number}
 * @example
 * parseAmount('1,234,567.89') => 1234567.89
 * parseAmount('1000') => 1000
 * parseAmount('abc') => 0
 */
export function parseAmount(value) {
  if (typeof value === 'string') {
    value = value.replace(/,/g, '').trim()
  }
  return isValidAmount(value) ? Number(value) : 0
}

/**
 * 将金额保留指定位数的小数（不加千分位）
 * @param {any} value 输入值
 * @param {number} decimalPlaces 保留几位小数，默认2
 * @returns {string}
 * @example
 * toFixedAmount('1234.567', 2) => "1234.57"
 * toFixedAmount(1000, 0) => "1000"
 * toFixedAmount('abc') => "0.00"
 */
export function toFixedAmount(value, decimalPlaces = 2) {
  return isValidAmount(value) ? Number(value).toFixed(decimalPlaces) : '0.00'
}

/**
 * 将金额转换为中文大写（人民币写法）
 * 例：1234.56 => 壹仟贰佰叁拾肆元伍角陆分
 * @param {any} value 输入金额
 * @returns {string}
 * @example
 * amountToChinese(1234.56) => "壹仟贰佰叁拾肆元伍角陆分"
 * amountToChinese('1000000') => "壹佰万元整"
 * amountToChinese('0.05') => "伍分"
 * amountToChinese('0') => "零元整"
 */
export function amountToChinese(value) {
  const units = ['', '拾', '佰', '仟']
  const bigUnits = ['', '万', '亿', '兆']
  const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']

  const num = parseAmount(value).toFixed(2)
  const [integerPart, decimalPart] = num.split('.')
  let result = ''

  // 整数部分
  const integerArr = integerPart.split('').reverse()
  let segment = ''
  for (let i = 0; i < integerArr.length; i++) {
    const digit = Number(integerArr[i])
    const unit = units[i % 4]
    const bigUnit = i % 4 === 0 ? bigUnits[Math.floor(i / 4)] : ''
    segment = digits[digit] + unit + (digit !== 0 ? bigUnit : '') + segment
  }

  // 清理多余的零
  result =
    segment
      .replace(/零[拾佰仟]?/g, '零')
      .replace(/零+/g, '零')
      .replace(/零(万|亿|兆)/g, '$1')
      .replace(/(亿)万/, '$1')
      .replace(/^零+/, '')
      .replace(/零$/, '') || '零'
  result += '元'

  // 小数部分
  const jiao = Number(decimalPart[0])
  const fen = Number(decimalPart[1])
  if (jiao === 0 && fen === 0) {
    result += '整'
  } else {
    if (jiao > 0) result += digits[jiao] + '角'
    if (fen > 0) result += digits[fen] + '分'
  }

  return result
}
